exports.workify   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
nc 1
dl 0
loc 1
rs 10
nop 0
1
/* global URL */
2
var q = require('q');
3
var webworkify = require('webworkify');
4
5
/**
6
 * wrapper around creating / using webworker that reuses webworker instance
7
 *
8
 * @param self
9
 * @param workerModuleFactory
10
 * @param message
11
 * @returns {*}
12
 */
13
module.exports = exports = {
14
    workify: function(self, workerModuleFactory, onLoad, message) {
15
        if (typeof message === "undefined") {
16
            if (typeof onLoad !== "undefined") {
17
                message = onLoad;
18
                onLoad = function noop() {};
19
            }
20
        }
21
22
        // create promise for result
23
        var deferred = q.defer();
24
25
        try {
26
            // init worker if necessary
27
            if (typeof self.worker === "undefined") {
28
                self.worker = webworkify(workerModuleFactory());
29
                self.first = true;
30
                self.id = 0;
31
                onLoad(self.worker);
0 ignored issues
show
Bug introduced by
The call to onLoad seems to have too many arguments starting with self.worker.
Loading history...
32
            }
33
34
            var worker = self.worker;
35
36
            // keep a unique id to distinguish between responses
37
            var id = self.id++;
38
39
            var onMessage = function(e) {
40
                if (self.first) {
41
                    self.first = false;
42
                    URL.revokeObjectURL(worker.objectURL);
43
                }
44
45
                // don't process messages that aren't for us
46
                if (e.data.id !== id) {
47
                    return;
48
                }
49
50
                deferred.resolve(e.data);
51
            };
52
53
            var onError = function(e) {
54
                deferred.reject(new Error(e.message.replace("Uncaught Error: ", '')));
55
            };
56
57
            var unsub = function() {
58
                worker.removeEventListener("message", onMessage);
59
                worker.removeEventListener("error", onError);
60
            };
61
62
            // register event listeners
63
            worker.addEventListener('message', onMessage, false);
64
            worker.addEventListener('error', onError, false);
65
66
            // submit message to worker to init work
67
            message.id = id;
68
            worker.postMessage(message);
69
70
            // return promise
71
            return deferred.promise.then(function(r) {
72
                unsub();
73
                return r;
74
            }, function(e) {
75
                unsub();
76
                throw e;
77
            });
78
        } catch (e) {
79
            deferred.reject(e);
80
            return deferred.promise;
81
        }
82
    }
83
};
84